// Copyright 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_OUTPUT_GEOMETRY_BINDING_H_
#define CC_OUTPUT_GEOMETRY_BINDING_H_

#include <stdint.h>

#include "gpu/command_buffer/client/gles2_interface.h"
#include "third_party/khronos/GLES2/gl2.h"
#include "third_party/khronos/GLES2/gl2ext.h"
#include "ui/gfx/geometry/rect_f.h"

namespace cc {

struct GeometryBindingVertex {
    float a_position[3];
    float a_texCoord[2];
    // Index of the vertex, divide by 4 to have the matrix for this quad.
    float a_index;
};

struct GeometryBindingQuad {
    GeometryBindingQuad();
    GeometryBindingQuad(const GeometryBindingVertex& vert0,
        const GeometryBindingVertex& vert1,
        const GeometryBindingVertex& vert2,
        const GeometryBindingVertex& vert3);
    GeometryBindingVertex v0, v1, v2, v3;
};

struct GeometryBindingQuadIndex {
    GeometryBindingQuadIndex();
    GeometryBindingQuadIndex(uint16_t index0,
        uint16_t index1,
        uint16_t index2,
        uint16_t index3,
        uint16_t index4,
        uint16_t index5);

    uint16_t data[6];
};

struct GeometryBinding {
    // All layer shaders share the same attribute locations for the vertex
    // positions and texture coordinates. This allows switching shaders without
    // rebinding attribute arrays.
    static int PositionAttribLocation() { return 0; }
    static int TexCoordAttribLocation() { return 1; }
    static int TriangleIndexAttribLocation() { return 2; }
};

void SetupGLContext(gpu::gles2::GLES2Interface* gl,
    GLuint quad_elements_vbo,
    GLuint quad_vertices_vbo);

} // namespace cc

#endif // CC_OUTPUT_GEOMETRY_BINDING_H_
